
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LENGTH 50
#define MAX_COURSE_NAME_LENGTH 50

// 成绩结构体
struct score
{
    char snum[9];
    char sname[11];
    int chinese;
    int math;
    int english;
    int sumcj; // 成绩总数
    int rank;  // 排名
};

// 学生结构体
typedef struct {
    int id;                   // 学号
    char name[MAX_NAME_LENGTH];   // 姓名
    float score;              // 成绩
} Student;

// 课程结构体
typedef struct {
    char name[MAX_COURSE_NAME_LENGTH];   // 课程名
    int studentCount;          // 选课人数
    Student students[MAX_STUDENTS];   // 选修课程的学生
} Course;

// 授课教师信息结构体
typedef struct {
    char name[MAX_NAME_LENGTH];   // 教师姓名
    char subject[MAX_COURSE_NAME_LENGTH];   // 教师教授的课程
} Teacher;

// 函数声明
void showmenu(void); // 菜单
int xg(int); // 修改成绩
void lr(int); // 录入成绩
void cx(int); // 查询成绩
void xhcx(int); // 学号查询
void xmcx(int); // 姓名查询
void allrankcx(int); // 排名查询
void showcxmenu(void); // 二级菜单，查询菜单
void xs(int); // 成绩显示
void jspm(int); // 计算排名
int sc(int); // 删除成绩
void bccj(void); // 保存成绩并退出
void displayTeacherInfo(); // 展示老师

// 显示教师管理子菜单
void showTeacherSubMenu() {
    system("cls");
    printf("*----------------------------------------------------*\n");
    printf("*               欢迎使用教师管理子系统               *\n");
    printf("*----------------------------------------------------*\n");
    printf("*               1： 录入教师信息                     *\n");
    printf("*               2： 修改教师信息                     *\n");
    printf("*               3： 教授科目信息                     *\n");
    printf("*               4： 显示所有教师信息                 *\n");
    printf("*               5： 返回主菜单                       *\n");
    printf("*----------------------------------------------------*\n");
    printf("选择操作<1-5>                                         \n");
    return;
}

void displayScores(Course* course) {
    printf("%-10s %-20s %-10s\n", "学号", "姓名", "成绩");
    for (int i = 0; i < course->studentCount; i++) {
        printf("%-10d %-20s %-10.2f\n",
            course->students[i].id,
            course->students[i].name,
            course->students[i].score);
    }
}

// 教师管理相关函数（需要您自己实现）
void inputTeacherInfo() {
    // Implementation needed
}

void modifyTeacherInfo() {
    // Implementation needed
}

void teachSubjectInfo() {
    // Implementation needed
}

void displayTeacherInfo() {
    printf("教师姓名：%s\n", "张老师");
    printf("教授课程：%s\n", "c语言程序设计");
    printf("教师姓名：%s\n", "王老师");
    printf("教授课程：%s\n", "Mysql数据库原理");
    printf("教师姓名：%s\n", "李老师");
    printf("教授课程：%s\n", "编译原理");
}

int main()
{
    int flag, n = 0, count = 0; // flag标志位,count计数,当前总人数
    // 判断文件里面有多少条记录
    FILE* fp;
    fp = fopen("cj.txt", "a+");
    if (fp == NULL)
    {
        printf("打开文件失败,请重试！\n");
        getch();
        fclose(fp);
        exit(0);
    }
    int c = 0;
    while (!feof(fp))
    {
        char cc = fgetc(fp);
        if (cc == EOF)
        {
            break;
        }
        c++;
    }
    count = c / 14;
    fclose(fp);

    do
    {
        showmenu();
        scanf("%d", &flag); // 选择操作
        switch (flag)
        {
        case 1: 
            printf("请输入您要录入的人数：");
            scanf("%d", &n);
            lr(n);
            count += n; 
            break;
        case 2: 
            count = sc(count); 
            break;
        case 3: 
            xg(count); 
            break;
        case 4: 
            cx(count); 
            break;
        case 5: 
            jspm(count); 
            break;
        case 6: 
            xs(count); 
            break;
        case 7: 
            showTeacherSubMenu();
            break; 
        case 8: 
            showcxmenu();
            break;
        case 0: 
            bccj(); 
            break;
        default:
            printf("输入错误，请重试！\n");
            getch();
        }
    } while (flag != 0);
    getch();
    return 0;
}

void showmenu()
{
    system("cls");
    printf("*----------------------------------------------------*\n");
    printf("*               欢迎使用**成绩管理系统               *\n");
    printf("*----------------------------------------------------*\n");
    printf("*               1： 录入成绩                         *\n");
    printf("*               2： 删除成绩                         *\n");
    printf("*               3： 修改成绩                         *\n");
    printf("*               4： 成绩查询                         *\n");
    printf("*               5： 成绩计算并排名                   *\n");
    printf("*               6： 显示成绩信息                     *\n");
    printf("*               7： 查询教师信息                     *\n");
    printf("*               8： 查询学生信息                     *\n");
    printf("*               0： 保存信息并退出系统               *\n");
    printf("*----------------------------------------------------*\n");
    printf("选择操作<0-8>                                         \n");
    return;
}

void lr(int n)
{
    struct score stu[100];
    FILE* fp;
    fp = fopen("cj.txt", "a+");
    if (fp == NULL)
    {
        printf("打开文件失败,请重试！\n");
        getch();
        fclose(fp);
        exit(0);
    }
    printf("请输入全部学生的学号，姓名，语文成绩，数学成绩，英语成绩；\n");
    int i;
    for (i = 0; i < n; i++)
    {
        printf("----第%d个学生----\n", i + 1);
        printf("学号:");
        scanf("%s", &stu[i].snum);

        printf("姓名：");
        scanf("%s,", &stu[i].sname);

        printf("语文成绩：");
        scanf("%d", &stu[i].chinese);

        printf("数学成绩：");
        scanf("%d", &stu[i].math);

        printf("英语成绩：");
        scanf("%d", &stu[i].english);

        stu[i].sumcj = 0;
        stu[i].rank = 0;
        // 写入数据
        fprintf(fp, "%s %s %d %d %d %d %d\n", stu[i].snum, stu[i].sname, stu[i].chinese, stu[i].math, stu[i].english, stu[i].sumcj, stu[i].rank);
    }
    fclose(fp);
    printf("添加学生成功,请按任意键返回\n");
    getch();
}

int sc(int n)
{
    struct score stu[100];
    struct score sub[99]; // 删除后的结构体数组
    char stnum[9]; // 学号
    int find = 0;
    printf("请输入你要删除的学生学号:");
    scanf("%s", &stnum);
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("打开文件失败,请联系管理员\n");
        getch();
        return -1;
    }
    int c = 0;
    int index = 0; // 用于记录目标序号
    while (!feof(fp)) // 不为空
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        if (strcmp(stnum, stu[c].snum) == 0)
        {
            find = 1; // 根据学号查找，找到赋值为1
            index = c; // 记录编号
        }
        c++;
    }
    fclose(fp);
    if (find == 0)
    {
        printf("没有找到这个学生\n");
        printf("按任意键返回\n");
        getch();
        return n;
    }
    else
    {
        int i;
        for (i = 0; i < index; i++)
        {
            sub[i] = stu[i]; // 复制目标之前
        }
        for (i = index; i < c; i++)
        {
            sub[i] = stu[i + 1]; // 复制目标之后
        }
        FILE* fp1;
        fp1 = fopen("cj.txt", "w+");
        if (fp1 == NULL)
        {
            printf("文件写入错误，联系管理员");
            return -1;
        }
        for (i = 0; i < c - 1; i++)
        {
            fprintf(fp1, "%s %s %d %d %d %d %d\n", sub[i].snum, sub[i].sname, sub[i].chinese, sub[i].math, sub[i].english, sub[i].sumcj, sub[i].rank);
        }
        fclose(fp1);
    }
    printf("删除成功,按任意键返回");
    getch();
    return n - 1;
}

int xg(int n)
{
    struct score stu[100];
    struct score xg;
    char snum[9];
    printf("请输入你要修改的学生学号:");
    scanf("%s", &snum);
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("打开文件失败,请联系管理员\n");
        getch();
        return -1;
    }
    int find = 0; // 查找标志位
    int c = 0;
    int i = 0;
    while (!feof(fp)) // 文件末尾
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        if (strcmp(snum, stu[c].snum) == 0)
        {
            find = 1;
            i = c;
        }
        c++;
    }
    fclose(fp);
    if (find == 0)
    {
        printf("没有找到这个学生，请联系管理员\n");
        getch();
        return -1;
    }
    else
    {
        printf("请输入修改后的信息：\n");
        printf("学号：");
        scanf("%s", &xg.snum);
        printf("姓名：");
        scanf("%s,", &xg.sname);
        printf("语文成绩：");
        scanf("%d", &xg.chinese);
        printf("数学成绩：");
        scanf("%d", &xg.math);
        printf("英语成绩：");
        scanf("%d", &xg.english);
        FILE* fp1;
        fp1 = fopen("cj.txt", "w+");
        if (fp1 == NULL)
        {
            printf("文件写入失败，请联系管理员");
            return -1;
        }
        for (int j = 0; j < c; j++)
        {
            if (j == i)
            {
                fprintf(fp1, "%s %s %d %d %d %d %d\n", xg.snum, xg.sname, xg.chinese, xg.math, xg.english, xg.sumcj, xg.rank);
            }
            else
            {
                fprintf(fp1, "%s %s %d %d %d %d %d\n", stu[j].snum, stu[j].sname, stu[j].chinese, stu[j].math, stu[j].english, stu[j].sumcj, stu[j].rank);
            }
        }
        fclose(fp1);
    }
    printf("修改成功，按任意键返回\n");
    getch();
    return 0;
}
void cx(int n)
{
    int flag;
    showcxmenu();
    scanf("%d", &flag);
    switch (flag)
    {
    case 1:
        xhcx();
        break;
    case 2:
        xmcx();
        break;
    case 3:
        allrankcx();
        break;
    default:
        printf("输入有误,请重试");
        getch();
    }
}


void xhcx()
{
    struct score stu[100];
    struct score stucx;
    char snum[9];
    int find = 0; // 查找标志位
    printf("请输入你要查找的学生学号:");
    scanf("%s", &snum);
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开错误，请联系管理员");
        getch();
        return;
    }
    int c = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        if (strcmp(snum, stu[c].snum) == 0)
        {
            find = 1;
            stucx = stu[c]; // 记录查找结构体
        }
        c++;
    }
    fclose(fp);
    if (find == 0)
    {
        printf("没有找到这个学生，联系管理员");
        getch();
        return;
    }
    else
    {
        printf("学号：%s\n", stucx.snum);
        printf("姓名：%s\n", stucx.sname);
        printf("语文成绩：%d\n", stucx.chinese);
        printf("数学成绩：%d\n", stucx.math);
        printf("英语成绩：%d\n", stucx.english);
        printf("总成绩：%d\n", stucx.sumcj);
        printf("名次：%d\n", stucx.rank);
    }
    getch();
}

void xmcx()
{
    struct score stu[100];
    struct score stucx;
    char sname[11];
    int find = 0;
    printf("请输入你要查找的学生姓名:");
    scanf("%s", &sname);
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开错误，请联系管理员");
        getch();
        return;
    }
    int c = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        if (strcmp(sname, stu[c].sname) == 0)
        {
            find = 1;
            stucx = stu[c];
        }
        c++;
    }
    fclose(fp);
    if (find == 0)
    {
        printf("没有找到这个学生，联系管理员");
        getch();
        return;
    }
    else
    {
        printf("学号：%s\n", stucx.snum);
        printf("姓名：%s\n", stucx.sname);
        printf("语文成绩：%d\n", stucx.chinese);
        printf("数学成绩：%d\n", stucx.math);
        printf("英语成绩：%d\n", stucx.english);
        printf("总成绩：%d\n", stucx.sumcj);
        printf("名次：%d\n", stucx.rank);
    }
    getch();
}

void allrankcx()
{
    struct score stu[100];
    struct score stucx[100]; // 记录当前排名的成绩
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开错误，请联系管理员");
        getch();
        return;
    }
    int c = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        c++;
    }
    fclose(fp);
    // 将数据重新按排名插入stucx结构体数组
    int rank = 0;
    for (int i = 0; i < c; i++)
    {
        if (stu[i].rank == rank + 1)
        {
            stucx[rank] = stu[i];
            rank++;
        }
    }
    for (int i = 0; i < c; i++)
    {
        if (stu[i].rank != 0)
        {
            printf("学号：%s\n", stucx[i].snum);
            printf("姓名：%s\n", stucx[i].sname);
            printf("语文成绩：%d\n", stucx[i].chinese);
            printf("数学成绩：%d\n", stucx[i].math);
            printf("英语成绩：%d\n", stucx[i].english);
            printf("总成绩：%d\n", stucx[i].sumcj);
            printf("名次：%d\n", stucx[i].rank);
        }
    }
    getch();
}

void zpj()
{
    struct score stu[100];
    FILE* fp;
    fp = fopen("cj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开错误，请联系管理员");
        getch();
        return;
    }
    int c = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %d %d %d %d\n", &stu[c].snum, &stu[c].sname, &stu[c].chinese, &stu[c].math, &stu[c].english, &stu[c].sumcj, &stu[c].rank);
        c++;
    }
    fclose(fp);
    // 计算成绩
    for (int i = 0; i < c; i++)
    {
        stu[i].sumcj = stu[i].chinese + stu[i].math + stu[i].english;
    }
    // 排序并计算名次
    struct score temp;
    for (int i = 0; i < c - 1; i++)
    {
        for (int j = i + 1; j < c; j++)
        {
            if (stu[i].sumcj < stu[j].sumcj)
            {
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
        }
    }
    for (int i = 0; i < c; i++)
    {
        stu[i].rank = i + 1;
    }
    // 写入文件
    FILE* fp1;
    fp1 = fopen("cj.txt", "w+");
    if (fp1 == NULL)
    {
        printf("文件写入错误，请联系管理员");
        getch();
        return;
    }
    for (int i = 0; i < c; i++)
    {
        fprintf(fp1, "%s %s %d %d %d %d %d\n", stu[i].snum, stu[i].sname, stu[i].chinese, stu[i].math, stu[i].english, stu[i].sumcj, stu[i].rank);
    }
    fclose(fp1);
    printf("总评计算完毕,按任意键返回");
    getch();
}

int main()
{
    int n = 0;
    while (1)
    {
        showmenu();
        int choice;
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            n = sc(n);
            break;
        case 2:
            n = sc(n);
            break;
        case 3:
            n = del(n);
            break;
        case 4:
            n = xg(n);
            break;
        case 5:
            cx(n);
            break;
        case 6:
            zpj();
            break;
        case 7:
            exit(0);
        default:
            printf("输入有误,请重试");
            getch();
        }
    }
    return 0;
}
